Static single assignment (SSA) form enables many compiler optimizations to be done efficiently. This form is an intermediate representation in which variable redefinition is replaced by variable re-naming. Thus, no variable is ever re-defined. When a variable is defined along more that one mutually exclusive path, a φ assignment for that variable is placed in the join node. Thus, in concurrent static single assignment (CSSA) form, the use-def chain reduces to a singleton set (as exactly one definition can reach any use in the program).
Concurrent SSA (CSSA) is the SSA form for parallel programs. With CSSA, in addition to φ assignments, parallel programs have ψ and π assignments. A ψ assignment is used at the cobegin/coend barrier node among concurrently implementing threads to merge the interleaved definitions of shared variables occurring in different threads. A π assignment is used to sample (that is, define) the value of a shared variable before its actual use if a definition of that variable, in a concurrently implementing thread, can reach the use.
Most existing approaches on CSSA form are targeted towards languages with implicit barriers like cobegin/coend and parallel do and synchronization primitives like wait/signal. Some have also considered parallel languages with mutual-exclusion primitives like locks. Synchronization barriers are not limited as in the languages that have been considered so far, which present a challenge in generating CSSA form for such general-barrier languages.